package online.abor.day12_study.provider_consumer.baozi;

public class Chi extends Thread {
    private Baozi baozi;

    public Chi(String name, Baozi baozi) {
        super(name);
        this.baozi = baozi;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (baozi) {
                if (!baozi.isFlag()) {
                    // 没包子 就等着
                    try {
                        baozi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    System.out.println(Thread.currentThread().getName() + "吃包子[" + baozi + "]");
                    baozi.setFlag(false);
                    /*
                     * 1. 当只有一个[吃包子线程]的时候，notify()就可以了，因为此时notify肯定是唤醒[做包子线程]不会造成死锁
                     * 此时没有包子，进入[做包子线程]，不会造成等待死锁
                     * 2. 当有多个[吃包子线程],notify()是从 处于等待的线程中取一个[另一个吃包子线程，做包子线程]
                     * 此时没有包子，如果唤醒的是[另一个吃包子线程]，就会造成互相等待死锁
                     * 3. 当有多个[吃包子线程]，应该唤醒所有的线程notifyAll()，保证能够唤醒做包子线程，才不会造成死锁
                     */
                    // baozi.notify();
                    baozi.notifyAll();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
